/**
 * @file lv_pony.c
 *
 */

/*********************
 *      INCLUDES
 *********************/
#include "osal/lv_os.h"

#if LV_USE_OS == LV_OS_CUSTOM

#include "misc/lv_log.h"

/*********************
 *      DEFINES
 *********************/

#define THREAD_TIMESLICE 20U

/**********************
 *      TYPEDEFS
 **********************/

/**********************
 *  STATIC PROTOTYPES
 **********************/

/**********************
 *  STATIC VARIABLES
 **********************/

/**********************
 *      MACROS
 **********************/

/**********************
 *   GLOBAL FUNCTIONS
 **********************/

lv_result_t lv_thread_init(lv_thread_t *thread, lv_thread_prio_t prio, void (*callback)(void *),
                           size_t stack_size, void *user_data)
{
    thread->thread = task_spawn("lvgl_pri_task", prio, 0, stack_size, (int (*)(uintptr_t))callback,
                                (uintptr_t)user_data);
    if (thread->thread == NULL) {
        LV_LOG_WARN("Error: Failed to create a pony thread.");
        return LV_RESULT_INVALID;
    } else {
        return LV_RESULT_OK;
    }
}

lv_result_t lv_thread_delete(lv_thread_t *thread)
{
    int ret = task_delete(thread->thread);
    if (ret != 0) {
        LV_LOG_WARN("Error: %d", ret);
        return LV_RESULT_INVALID;
    } else {
        return LV_RESULT_OK;
    }
}

lv_result_t lv_mutex_init(lv_mutex_t *mutex)
{
    mutex->mutex = mutex_create();
    if (mutex->mutex == NULL) {
        LV_LOG_WARN("create mutex failed");
        return LV_RESULT_INVALID;
    } else {
        return LV_RESULT_OK;
    }
}

lv_result_t lv_mutex_lock(lv_mutex_t *mutex)
{
    int ret = mutex_lock(mutex->mutex);
    if (ret) {
        LV_LOG_WARN("Error: %d", ret);
        return LV_RESULT_INVALID;
    } else {
        return LV_RESULT_OK;
    }
}

lv_result_t lv_mutex_lock_isr(lv_mutex_t *mutex)
{
    LV_UNUSED(mutex);
    return LV_RESULT_INVALID;
}

lv_result_t lv_mutex_unlock(lv_mutex_t *mutex)
{
    int ret = mutex_unlock(mutex->mutex);
    if (ret) {
        LV_LOG_WARN("Error: %d", ret);
        return LV_RESULT_INVALID;
    } else {
        return LV_RESULT_OK;
    }
}

lv_result_t lv_mutex_delete(lv_mutex_t *mutex)
{
    int ret = mutex_destroy(mutex->mutex);
    if (ret) {
        LV_LOG_WARN("Error: %d", ret);
        return LV_RESULT_INVALID;
    } else {
        return LV_RESULT_OK;
    }
}

lv_result_t lv_thread_sync_init(lv_thread_sync_t *sync)
{
    sync->sem = sem_create(0);
    if (sync->sem == NULL) {
        LV_LOG_WARN("create semaphore failed");
        return LV_RESULT_INVALID;
    } else {
        return LV_RESULT_OK;
    }
}

lv_result_t lv_thread_sync_wait(lv_thread_sync_t *sync)
{
    int ret = sem_wait(sync->sem);
    if (ret) {
        LV_LOG_WARN("Error: %d", ret);
        return LV_RESULT_INVALID;
    } else {
        return LV_RESULT_OK;
    }
}

lv_result_t lv_thread_sync_signal(lv_thread_sync_t *sync)
{
    int ret = sem_post(sync->sem);
    if (ret) {
        LV_LOG_WARN("Error: %d", ret);
        return LV_RESULT_INVALID;
    } else {
        return LV_RESULT_OK;
    }
}

lv_result_t lv_thread_sync_delete(lv_thread_sync_t *sync)
{
    int ret = sem_destroy(sync->sem);
    if (ret) {
        LV_LOG_WARN("Error: %d", ret);
        return LV_RESULT_INVALID;
    } else {
        return LV_RESULT_OK;
    }
}

lv_result_t lv_thread_sync_signal_isr(lv_thread_sync_t *sync)
{
    LV_UNUSED(sync);
    return LV_RESULT_INVALID;
}

/**********************
 *   STATIC FUNCTIONS
 **********************/

#endif /*LV_USE_OS == LV_OS_CUSTOM*/
